﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Negoci = DeltaFlex.Negoci;
using Eines = DeltaFlex.Eines;
using DeltaFlex.Eines;
using System.IO;
using System.Configuration;
using System.Globalization;

namespace Vista.Gestio
{
    public partial class EditAlbara : Page
    {
        #region Variables amb ViewState
        public decimal Total
        {
            get
            {
                return (ViewState["_total"] == null ?
                   0 : Convert.ToDecimal(ViewState["_total"]));
            }
            set { ViewState["_total"] = value; }
        }

        public string PrevPage
        {
            get
            {
                return (ViewState["_prevPage"] == null ?
                    string.Empty : ViewState["_prevPage"].ToString());
            }
            set { ViewState["_prevPage"] = value; }
        }
        #endregion
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                BolcarAlbaraEditar();
                PrevPage = Request.UrlReferrer.ToString();
            }
        }

        #region Carregar Albara des de BD per a editar-lo
        private void BolcarAlbaraEditar()
        {
            Negoci.Albara albara;
            string infoAlbara = string.Empty;
            string infoClient = string.Empty;
            Total = 0;

            if (Session["_EditAlbara"] != null)
            {
                albara = (Negoci.Albara)Session["_EditAlbara"];
                
                lblTitulEditAlbara.Text += albara.IdAlbara.ToString();
                tbData.Text = albara.Data.ToShortDateString();

                lblAlbara.Text = albara.IdAlbara.ToString();
                lblNCliente.Text += albara.Client.IdClient.ToString(); 

                lblOrdre.Text = albara.OrdreTreball.IdOrdre_Treball.ToString();
                ddlClient.DataBind();
                ddlClient.SelectedValue = albara.Client.IdClient.ToString();

                tbPedido.Text = albara.OrdreTreball.PedidoClient;
                lblDireccion.Text = albara.Client.AdreçaClient.CarrerNumero + " " + albara.Client.AdreçaClient.Poligon;

                tbReferencia.Text = albara.OrdreTreball.ReferenciaClient;
                lblCiudad.Text = albara.Client.AdreçaClient.Ciutat + " " + albara.Client.AdreçaClient.CodiPostal; 

                tbTrabajo.Text = albara.OrdreTreball.IdTreball;
                lblProvincia.Text = albara.Client.AdreçaClient.Provincia + " (" + albara.Client.AdreçaClient.Pais + ")";

                if (string.IsNullOrEmpty(albara.OrdreTreball.NumTroquel) || albara.OrdreTreball.NumTroquel.Equals("-"))
                    tbTroquel.Text = albara.OrdreTreball.Mesures;
                else
                    tbTroquel.Text = albara.OrdreTreball.NumTroquel;
                lblTelf.Text = albara.Client.TelefonClient.ToString();

            }
            else
            {
                mpEditarAlbara.LabelHeader = ConstantsAlbara.mplhEditarAlbara;
                mpEditarAlbara.LabelBody = ConstantsAlbara.mplbEditarAlbaraNoTrobat;
                mpEditarAlbara.MostraInfo = true;
                mpEditarAlbara.MostrarModal();

            }
        }

        #endregion

        #region Actualitzar Albara
        private void ActualitzarAlbara()
        {
            int idAlbara = Convert.ToInt32(lblAlbara.Text);
            int idOrdre = Convert.ToInt32(lblOrdre.Text);
            int idClient = Convert.ToInt32(ddlClient.SelectedValue);
            string pedidoClient = tbPedido.Text;
            string referenciaClient = tbReferencia.Text;
            string idTreball = tbTrabajo.Text;
            string numTroquel = tbTroquel.Text;
            DateTime data = Convert.ToDateTime(tbData.Text);

            List<Negoci.Concepte_Albara> lstConcepteAlbara = (List<Negoci.Concepte_Albara>)odsEditConcepteAlbara.Select();
            if (lstConcepteAlbara.Count > 0)
                Total = lstConcepteAlbara.Sum(i => i.Import);

            Negoci.Albara.ActualitzarAlbara(idAlbara, idOrdre, pedidoClient, referenciaClient, idTreball, numTroquel,
                                             idClient, data, Total);

        }
        #endregion

        #region Actualitzar Concepte Albra

        #endregion

        #region Imprimir Albarà
        private void ImprimirAlbara()
        {
            Negoci.Albara albara;
            if (Session["_EditAlbara"] != null)
            {
                albara = (Negoci.Albara)Session["_EditAlbara"];
                Negoci.Ordre_Treball ot = albara.OrdreTreball;

                #region Inicialització i estils
                PDFManager pdf = new PDFManager();
                pdf.EmptyLineHeight = 5;
                pdf.Margin = 32;

                PDFTextStyle styleHeaderTitle = new PDFTextStyle(Eines.FontSize.xsmall, Eines.TextAlign.Center, true, false, false);
                PDFTextStyle styleBodyTitle = new PDFTextStyle(Eines.FontSize.xxsmall, Eines.TextAlign.Left, true, false, false);
                PDFTextStyle styleBodyTitleR = new PDFTextStyle(Eines.FontSize.xxsmall, Eines.TextAlign.Right, true, false, false);
                PDFTextStyle styleBodyNormalLeft = new PDFTextStyle(Eines.FontSize.xxsmaller, Eines.TextAlign.Left, false, false, false);
                PDFTextStyle styleBodyNormalRight = new PDFTextStyle(Eines.FontSize.xxsmaller, Eines.TextAlign.Right, false, false, false);
                PDFTextStyle styleBodyNormalCenter = new PDFTextStyle(Eines.FontSize.xxsmaller, Eines.TextAlign.Center, false, false, false);

                string logoPath = Server.MapPath("~/Imatges/logoAlbaran.jpg");

                PDFDocument doc = new PDFDocument();
                #endregion

                #region Capçalera
                doc.Header = new PDFHeader(new PDFText("", styleHeaderTitle),
                                           new PDFImage(logoPath),
                                           false,
                                           50);

                doc.Header.UseRealHeight = false;
                #endregion

                #region Cos
                doc.Body = new PDFBody();

                List<IPDFElement> elements;

                // Títul
                elements = new List<IPDFElement>();
                elements.Add(new Eines.PDFText("Albarn", styleBodyTitle));
                elements.Add(new Eines.PDFText("Fecha: " + DateTime.Today.ToShortDateString(), styleBodyTitleR));
                doc.Body.Rows.Add(new Eines.PDFRow(elements, "11", 0));

                // Línia
                elements = new List<IPDFElement>();
                elements.Add(new Eines.PDFLine(LineWidth.Half));
                doc.Body.Rows.Add(new Eines.PDFRow(elements, "100", 0));

                // Informació de l'Albarà i el nº de compte
                elements = new List<IPDFElement>();
                elements.Add(new Eines.PDFText("Albaran nº: " + albara.IdAlbara, styleBodyNormalLeft));
                elements.Add(new Eines.PDFText("Nº Cliente: " + albara.Client.IdClient, styleBodyNormalRight));
                doc.Body.Rows.Add(new Eines.PDFRow(elements, "11", 0));

                elements = new List<IPDFElement>();
                elements.Add(new Eines.PDFText("Nº Orden: " + ot.IdOrdre_Treball, styleBodyNormalLeft));
                elements.Add(new Eines.PDFText("Cliente: " + albara.Client.NomClient + " - " + albara.Client.NifClient, styleBodyNormalRight));
                doc.Body.Rows.Add(new Eines.PDFRow(elements, "11", 0));

                elements = new List<IPDFElement>();
                elements.Add(new Eines.PDFText("Nº Pedido/Cod. Cliente: " + ot.PedidoClient, styleBodyNormalLeft));
                elements.Add(new Eines.PDFText(albara.Client.AdreçaClient.CarrerNumero + " " + albara.Client.AdreçaClient.Poligon, styleBodyNormalRight));
                doc.Body.Rows.Add(new Eines.PDFRow(elements, "11", 0));

                elements = new List<IPDFElement>();
                elements.Add(new Eines.PDFText("Referencia: " + ot.ReferenciaClient, styleBodyNormalLeft));
                elements.Add(new Eines.PDFText(albara.Client.AdreçaClient.Ciutat + " " + albara.Client.AdreçaClient.CodiPostal, styleBodyNormalRight));
                doc.Body.Rows.Add(new Eines.PDFRow(elements, "11", 0));

                elements = new List<IPDFElement>();
                elements.Add(new Eines.PDFText("Id Trebajo: " + ot.IdTreball, styleBodyNormalLeft));
                elements.Add(new Eines.PDFText(albara.Client.AdreçaClient.Provincia + " (" + albara.Client.AdreçaClient.Pais + ")", styleBodyNormalRight));
                doc.Body.Rows.Add(new Eines.PDFRow(elements, "11", 0));

                elements = new List<IPDFElement>();
                if (String.IsNullOrEmpty(ot.NumTroquel) || ot.NumTroquel.Equals("-"))
                    elements.Add(new Eines.PDFText("Nº Troquel: " + ot.Mesures, styleBodyNormalLeft));
                else
                    elements.Add(new Eines.PDFText("Nº Troquel: " + ot.NumTroquel, styleBodyNormalLeft));
                elements.Add(new Eines.PDFText(albara.Client.TelefonClient.ToString(), styleBodyNormalRight));
                doc.Body.Rows.Add(new Eines.PDFRow(elements, "11", 0));

                // Doble Línia
                elements = new List<IPDFElement>();
                elements.Add(new Eines.PDFLine(LineWidth.Double));
                doc.Body.Rows.Add(new Eines.PDFRow(elements, "100", 0));

                // Espai en blanc
                elements = new List<IPDFElement>();
                elements.Add(new Eines.PDFText());
                elements.Add(new Eines.PDFText());
                doc.Body.Rows.Add(new Eines.PDFRow());

                // Doble Línia
                elements = new List<IPDFElement>();
                elements.Add(new Eines.PDFLine(LineWidth.Double));
                doc.Body.Rows.Add(new Eines.PDFRow(elements, "100", 0));

                // Conceptes_OT Albarà
                elements = new List<IPDFElement>();
                elements.Add(new Eines.PDFText("|Ref. Articulo", styleBodyNormalLeft));
                elements.Add(new Eines.PDFText("|Concepto", styleBodyNormalLeft));
                elements.Add(new Eines.PDFText("|Cantidad", styleBodyNormalLeft));
                elements.Add(new Eines.PDFText("|Medida", styleBodyNormalLeft));
                elements.Add(new Eines.PDFText("|Superfície", styleBodyNormalLeft));
                elements.Add(new Eines.PDFText("|Unidades", styleBodyNormalLeft));
                elements.Add(new Eines.PDFText("|Preu de Venta", styleBodyNormalLeft));
                elements.Add(new Eines.PDFText("|Importe", styleBodyNormalLeft));
                doc.Body.Rows.Add(new Eines.PDFRow(elements));

                // Linia
                elements = new List<IPDFElement>();
                elements.Add(new Eines.PDFLine(LineWidth.Half));
                doc.Body.Rows.Add(new Eines.PDFRow(elements, "100", 0));

                // Llistat de Conceptes de l'Albara
                List<Negoci.Concepte_Albara> lstConcepteAlbara = Negoci.Concepte_Albara.LlistarConcepte_Albarans(albara.IdAlbara);

                decimal total = 0;
                foreach (Negoci.Concepte_Albara element in lstConcepteAlbara)
                {
                    elements = new List<IPDFElement>();
                    elements.Add(new Eines.PDFText(element.Article.ReferenciaArticle, styleBodyNormalLeft));
                    elements.Add(new Eines.PDFText(element.Article.NomArticle, styleBodyNormalLeft));
                    elements.Add(new Eines.PDFText(element.Quantitat.ToString("N2", CultureInfo.CurrentCulture), styleBodyNormalCenter));
                    elements.Add(new Eines.PDFText(element.StrSuperficie, styleBodyNormalLeft));
                    elements.Add(new Eines.PDFText(element.DecimalSuperficie.ToString("N5", CultureInfo.CurrentCulture), styleBodyNormalLeft));
                    elements.Add(new Eines.PDFText(element.Article.Unitat, styleBodyNormalLeft));
                    elements.Add(new Eines.PDFText(element.Pvp.ToString("C2", CultureInfo.CurrentCulture), styleBodyNormalLeft));
                    elements.Add(new Eines.PDFText(element.Import.ToString("C2", CultureInfo.CurrentCulture), styleBodyNormalLeft));
                    doc.Body.Rows.Add(new Eines.PDFRow(elements));

                    total += element.Import;
                }

                // Espai en blanc
                elements = new List<IPDFElement>();
                elements.Add(new Eines.PDFText(string.Empty));
                doc.Body.Rows.Add(new Eines.PDFRow(elements, 100));

                // TOTAL
                elements = new List<IPDFElement>();
                elements.Add(new Eines.PDFText("TOTAL " + total.ToString("C2", CultureInfo.CurrentCulture), styleBodyTitleR));
                doc.Body.Rows.Add(new Eines.PDFRow(elements));

                #endregion

                #region Peu
                List<string> lstTextPeu = new List<string>();
                lstTextPeu.Add("Observaciones del cliente");
                lstTextPeu.Add("Pol.Ind. Cataluña Sud");
                lstTextPeu.Add("parcela 24.4");
                lstTextPeu.Add("43500 Tortosa");
                lstTextPeu.Add("Tarragona (España)");
                lstTextPeu.Add("DeltaFlex, S.C.P.- J55633861");

                doc.Footer = new PDFFooter(true, lstTextPeu, styleBodyTitle);

                #endregion

                #region Finalització

                pdf.Documentos.Add(doc);

                string nomFitxer = "Albarà " + DateTime.Today.ToString("dd-mm-yyyy") + ".pdf";

                string pathPDF = Server.MapPath(ConfigurationManager.AppSettings["pathTMP"]) + nomFitxer;

                if (File.Exists(pathPDF))
                    File.Delete(pathPDF);

                pdf.CrearPDF(Server.MapPath(ConfigurationManager.AppSettings["pathTMP"]), nomFitxer, "Factura");

                FileStream file = File.Open(pathPDF, FileMode.Open, FileAccess.Read);

                BinaryReader br = new BinaryReader(file);
                byte[] dades = new byte[(int)file.Length];
                br.Read(dades, 0, (int)file.Length);
                br.Close();
                file.Close();

                if (File.Exists(pathPDF))
                    File.Delete(pathPDF);

                if (dades != null)
                {
                    Response.ContentType = "application/pdf";
                    Response.AppendHeader("content-length", dades.Length.ToString());
                    Response.AppendHeader("content-disposition", "attachment; filename=" + nomFitxer);
                    Response.BinaryWrite(dades);
                    Response.End();
                }
                
                #endregion
            }
            else
            {
                mpEditarAlbara.LabelHeader = ConstantsAlbara.mplhEditarAlbara;
                mpEditarAlbara.LabelBody = ConstantsAlbara.mplbEditarAlbaraNoTrobat;
                mpEditarAlbara.MostraInfo = true;
                mpEditarAlbara.MostrarModal();

            }
        }
        #endregion


        #region Events
        protected void ddlClient_TextChanged(object sender, EventArgs e)
        {
            int idClient = Convert.ToInt32(ddlClient.SelectedValue);
            Negoci.Client client = Negoci.Client.LlistarClientByIDClient(idClient)[0];

            lblNCliente.Text = "Nº Cliente: ";

            lblNCliente.Text += client.IdClient.ToString();
            lblDireccion.Text = client.AdreçaClient.CarrerNumero + " " + client.AdreçaClient.Poligon;
            lblCiudad.Text = client.AdreçaClient.Ciutat + " " + client.AdreçaClient.CodiPostal;
            lblProvincia.Text = client.AdreçaClient.Provincia + " (" + client.AdreçaClient.Pais + ")";
            lblTelf.Text = client.TelefonClient.ToString();

            upEditAlbara.Update();
        }

        protected void btnImprimir_Click(object sender, EventArgs e)
        {
            ImprimirAlbara();
        }
        protected void btnEditarAlbara_Click(object sender, EventArgs e)
        {
            ActualitzarAlbara();
        }
        protected void btnTornar_Click(object sender, EventArgs e)
        {
            if (!string.IsNullOrEmpty(PrevPage))
                Response.Redirect(PrevPage);
        }

        protected void gvEditConcepteAlbara_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            /*decimal import = 0;
            
            if ((e.Row.FindControl(("lblImport"))) != null)
                import = Convert.ToDecimal(((Label)e.Row.FindControl("lblImport")).Text);
             */
        }

        protected void gvEditConcepteAlbara_RowUpdating(object sender, GridViewUpdateEventArgs e)
        {
            int idConcepteAlbara = Convert.ToInt32(((Label)gvEditConcepteAlbara.Rows[e.RowIndex].FindControl("lblIdConcepteAlbara")).Text);
            int oldIdArticle = Convert.ToInt32(((Label)gvEditConcepteAlbara.Rows[e.RowIndex].FindControl("lblIdArticle")).Text);
            int newIdArticle = Convert.ToInt32(((DropDownList)gvEditConcepteAlbara.Rows[e.RowIndex].FindControl("ddlConcepte")).SelectedValue);
            decimal quantitat = Convert.ToDecimal(((TextBox)gvEditConcepteAlbara.Rows[e.RowIndex].FindControl("tbQuantitat")).Text);
            string strSuperficie = string.IsNullOrEmpty((((TextBox)gvEditConcepteAlbara.Rows[e.RowIndex].FindControl("tbStrSuperficie")).Text)) ? "-" :
                                    (((TextBox)gvEditConcepteAlbara.Rows[e.RowIndex].FindControl("tbStrSuperficie")).Text);
            decimal decimalSuperficie = Convert.ToDecimal(((TextBox)gvEditConcepteAlbara.Rows[e.RowIndex].FindControl("tbDecimalSuperficie")).Text);
            string unitats = (((TextBox)gvEditConcepteAlbara.Rows[e.RowIndex].FindControl("tbUnitats")).Text);
            decimal pvp = Convert.ToDecimal(((TextBox)gvEditConcepteAlbara.Rows[e.RowIndex].FindControl("tbpvp")).Text);
            decimal newImport = Convert.ToDecimal(((TextBox)gvEditConcepteAlbara.Rows[e.RowIndex].FindControl("tbImport")).Text);

            string missatge = string.Empty;

            odsEditConcepteAlbara.UpdateParameters.Add("idConcepte_Albara", TypeCode.Int32, idConcepteAlbara.ToString());
            odsEditConcepteAlbara.UpdateParameters.Add("idArticle", TypeCode.Int32, newIdArticle.ToString());
            odsEditConcepteAlbara.UpdateParameters.Add("quantitat", TypeCode.Decimal, quantitat.ToString());
            odsEditConcepteAlbara.UpdateParameters.Add("strSuperficie", strSuperficie);
            odsEditConcepteAlbara.UpdateParameters.Add("decimalSuperficie", TypeCode.Decimal, decimalSuperficie.ToString());
            odsEditConcepteAlbara.UpdateParameters.Add("unitats", unitats);
            odsEditConcepteAlbara.UpdateParameters.Add("pvp", TypeCode.Decimal, pvp.ToString());
            odsEditConcepteAlbara.UpdateParameters.Add("import", TypeCode.Decimal, newImport.ToString());

            try
            {
                odsEditConcepteAlbara.Update();
            }
            catch (Exception ex) { missatge = ex.Message; }

            if (string.IsNullOrEmpty(missatge))
                mpEditarAlbara.LabelBody = ConstantsAlbara.mplbEditarAlbaraOK;
            else
                 mpEditarAlbara.LabelBody = ConstantsAlbara.mplbEditarAlbaraKO + " <br/> " + missatge;

            mpEditarAlbara.LabelHeader = ConstantsAlbara.mplhEditarAlbara;
            mpEditarAlbara.MostraInfo = true;
            mpEditarAlbara.MostrarModal();
        }

        #endregion
    }
}